home *** CD-ROM | disk | FTP | other *** search
/ Software Vault: The Gold Collection / Software Vault - The Gold Collection (American Databankers) (1993).ISO / cdr26 / netprog.zip / NETPROG.TAR / lock / lockmainsem.c < prev    next >
C/C++ Source or Header  |  1989-12-17  |  1KB  |  46 lines

  1. /*
  2.  * Locking example using the simpler semaphore operations.
  3.  */
  4.  
  5. #include    <sys/types.h>
  6.  
  7. #define    SEQFILE        "seqno"
  8. #define    SEMKEY        ((key_t) 23456L)
  9. #define    MAXBUFF           100
  10.  
  11. main()
  12. {
  13.     int    fd, i, n, pid, seqno, semid;
  14.     char    buff[MAXBUFF];
  15.  
  16.     pid = getpid();
  17.     if ( (fd = open(SEQFILE, 2)) < 0)
  18.         err_sys("can't open %s", SEQFILE);
  19.     if ( (semid = sem_create(SEMKEY, 1)) < 0)
  20.         err_sys("can't open semaphore");
  21.  
  22.     for (i = 0; i < 20; i++) {
  23.         sem_wait(semid);        /* get the lock */
  24.  
  25.         lseek(fd, 0L, 0);        /* rewind before read */
  26.         if ( (n = read(fd, buff, MAXBUFF)) <= 0)
  27.             err_sys("read error");
  28.         buff[n] = '\0';        /* null terminate for sscanf */
  29.  
  30.         if ( (n = sscanf(buff, "%d\n", &seqno)) != 1)
  31.             err_sys("sscanf error");
  32.         printf("pid = %d, seq# = %d\n", pid, seqno);
  33.  
  34.         seqno++;
  35.  
  36.         sprintf(buff, "%03d\n", seqno);
  37.         n = strlen(buff);
  38.         lseek(fd, 0L, 0);        /* rewind before write */
  39.         if (write(fd, buff, n) != n)
  40.             err_sys("write error");
  41.  
  42.         sem_signal(semid);        /* release the lock */
  43.     }
  44.     sem_close(semid);
  45. }
  46.